0. Préparatifs

Je charge mes deux fichiers: celui avec les nœuds (nodes.csv) et celui avec les arêtes (edges.csv).

J’affiche les premiers éléments de chaque fichier, et je compte les rangs pour me faire une idée de ce qui se trouve dans mes données

##   id              label      type
## 1  1            Molière    Auteur
## 2  2 Guillaume de Luyne  Libraire
## 3  3      Claude Barbin  Libraire
## 4  4   Charles de Sercy  Libraire
## 5  5       Jean Hénault Imprimeur
## 6  6      François Noël Imprimeur
##   from to
## 1    1  2
## 2    1  3
## 3    1  4
## 4    1  5
## 5    1  6
## 6    1  7
## [1] 27
## [1] 27
## [1] 242
## [1] 106

Je transforme ces deux objets en données igraph, qui vont me permettre de faire mes analyses de réseau par la suite.

## [1] "igraph"

Mes données se présentent sous cette forme:

## IGRAPH 375b81c UN-B 27 242 -- 
## + attr: name (v/c), label (v/c), type (v/c)
## + edges from 375b81c (vertex names):
##  [1] 1 --2  1 --3  1 --4  1 --5  1 --6  1 --7  2 --3  2 --4  2 --5  2 --6 
## [11] 2 --7  3 --4  3 --5  3 --6  3 --7  4 --5  4 --6  4 --7  5 --6  5 --7 
## [21] 6 --7  1 --8  1 --9  1 --7  8 --9  7 --8  7 --9  1 --4  1 --2  1 --10
## [31] 1 --3  1 --12 1 --7  2 --4  4 --10 3 --4  4 --12 4 --7  2 --10 2 --3 
## [41] 2 --12 2 --7  3 --10 10--12 7 --10 3 --12 3 --7  7 --12 1 --2  1 --4 
## [51] 1 --10 1 --3  1 --12 1 --7  2 --4  2 --10 2 --3  2 --12 2 --7  4 --10
## [61] 3 --4  4 --12 4 --7  3 --10 10--12 7 --10 3 --12 3 --7  7 --12 1 --3 
## [71] 1 --12 1 --7  3 --12 3 --7  7 --12 1 --3  1 --12 1 --13 3 --12 3 --13
## + ... omitted several edges

Je peux désormais afficher les nœuds, les arêtes de cette manière. Je peux aussi sélectionner certaines colonnes pour chaque fichier d’une manière particulière aux objets igraph

## + 242/242 edges from 375b81c (vertex names):
##   [1] 1 --2  1 --3  1 --4  1 --5  1 --6  1 --7  2 --3  2 --4  2 --5  2 --6 
##  [11] 2 --7  3 --4  3 --5  3 --6  3 --7  4 --5  4 --6  4 --7  5 --6  5 --7 
##  [21] 6 --7  1 --8  1 --9  1 --7  8 --9  7 --8  7 --9  1 --4  1 --2  1 --10
##  [31] 1 --3  1 --12 1 --7  2 --4  4 --10 3 --4  4 --12 4 --7  2 --10 2 --3 
##  [41] 2 --12 2 --7  3 --10 10--12 7 --10 3 --12 3 --7  7 --12 1 --2  1 --4 
##  [51] 1 --10 1 --3  1 --12 1 --7  2 --4  2 --10 2 --3  2 --12 2 --7  4 --10
##  [61] 3 --4  4 --12 4 --7  3 --10 10--12 7 --10 3 --12 3 --7  7 --12 1 --3 
##  [71] 1 --12 1 --7  3 --12 3 --7  7 --12 1 --3  1 --12 1 --13 3 --12 3 --13
##  [81] 12--13 1 --2  1 --4  1 --14 1 --15 1 --16 1 --10 1 --3  1 --12 1 --5 
##  [91] 2 --4  2 --14 2 --15 2 --16 2 --10 2 --3  2 --12 2 --5  4 --14 4 --15
## + ... omitted several edges
## + 27/27 vertices, named, from 375b81c:
##  [1] 1  2  3  4  5  6  7  8  9  10 12 13 14 15 16 17 18 19 20 21 22 23 24
## [24] 25 26 27 28
##  [1] "Molière"                  "Guillaume de Luyne"      
##  [3] "Claude Barbin"            "Charles de Sercy"        
##  [5] "Jean Hénault"             "François Noël"           
##  [7] "Christophe Journel"       "Sieur de Neuf-Villenaine"
##  [9] "Jean Ribou"               "Jean Guignard"           
## [11] "Gabriel Quinet"           "François II Noël"        
## [13] "Thomas Jolly"             "Louis Billaine"          
## [15] "Estienne Loyson"          "Claude Blageart"         
## [17] "Pierre Trabouillet"       "Nicolas Le Gras"         
## [19] "Théodore Girard"          "Etienne Maucroy"         
## [21] "Claude II Calleville"     "Claude Audinet"          
## [23] "Pierre Le Monnier"        "Pierre Corneille"        
## [25] "Philippe Quinault"        "Pierre Promé"            
## [27] "François Muguet"         
##  [1] "Auteur"    "Libraire"  "Libraire"  "Libraire"  "Imprimeur"
##  [6] "Imprimeur" "Imprimeur" "Libraire"  "Libraire"  "Libraire" 
## [11] "Libraire"  "Imprimeur" "Libraire"  "Libraire"  "Libraire" 
## [16] "Imprimeur" "Libraire"  "Libraire"  "Libraire"  "Imprimeur"
## [21] "Imprimeur" "Imprimeur" "Libraire"  "Auteur"    "Auteur"   
## [26] "Libraire"  "Imprimeur"

1. Mon premier graphe

Je peux désormais fabriquer mon réseau avec la fonction plot:

Il existe une fonction alternative plot.igraph, qui fait la même chose

Il existe enfin une fonction tkplot qui est un prototype d’interface utilisateur:

Je dispose d’un grand nombre de paramètres pour modifier l’apparence de mon graph et le rendre (si on en a le talent) esthétique:

On peut customiser encore plus la décoration en intervenant plus lourdement sur la mise en page. Une manière de faire va être de créer des vecteurs à partir des données, en substituant la valeur qui nous intéresse par la forme que l’on souhaite lui donner. Par exemple, si je veux changer la couleur du nœud en fonction du label

##  [1] "Auteur"    "Libraire"  "Libraire"  "Libraire"  "Imprimeur"
##  [6] "Imprimeur" "Imprimeur" "Libraire"  "Libraire"  "Libraire" 
## [11] "Libraire"  "Imprimeur" "Libraire"  "Libraire"  "Libraire" 
## [16] "Imprimeur" "Libraire"  "Libraire"  "Libraire"  "Imprimeur"
## [21] "Imprimeur" "Imprimeur" "Libraire"  "Auteur"    "Auteur"   
## [26] "Libraire"  "Imprimeur"
##  [1] "Auteur"    "orange"    "orange"    "orange"    "Imprimeur"
##  [6] "Imprimeur" "Imprimeur" "orange"    "orange"    "orange"   
## [11] "orange"    "Imprimeur" "orange"    "orange"    "orange"   
## [16] "Imprimeur" "orange"    "orange"    "orange"    "Imprimeur"
## [21] "Imprimeur" "Imprimeur" "orange"    "Auteur"    "Auteur"   
## [26] "orange"    "Imprimeur"
##  [1] "green"  "orange" "orange" "orange" "red"    "red"    "red"   
##  [8] "orange" "orange" "orange" "orange" "red"    "orange" "orange"
## [15] "orange" "red"    "orange" "orange" "orange" "red"    "red"   
## [22] "red"    "orange" "green"  "green"  "orange" "red"

Je peux désormais appliquer cette couleur à chaque nœud

Je peux faire la même opération avec la forme des nœuds, et améliorer encore le rendu.

ATTENTION: le rendu dans RStudio n’est pas forcément optimum: pensez l’ouvrir dans une nouvelle fenêtre pour voir le résultat.

Nous avons encore un problème: les relations multiples sont toutes dessinées, car elles sont restées dans le tableau. Quelles sont-elles?

Deux problèmes sont possibles: * Une boucle (loop) est un nœud relié par une arête à lui-même * Un multiple (multiple) sont deux nœuds reliés plusieurs fois ensemble. N.B. si le graph est dirigé 2->1 n’est pas un multiple de 1->2, mais s’il est dirigé oui.

##   [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [12] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [23] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [34] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [45] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [56] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [67] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [78] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [89] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [100] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [111] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [122] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [133] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [144] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [155] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [166] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [177] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [188] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [199] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [210] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [221] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [232] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##   [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [12] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [23] FALSE  TRUE FALSE FALSE FALSE  TRUE  TRUE FALSE  TRUE FALSE  TRUE
##  [34]  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE FALSE
##  [45] FALSE FALSE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
##  [56]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
##  [67]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
##  [78] FALSE  TRUE FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE  TRUE  TRUE
##  [89]  TRUE  TRUE  TRUE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE FALSE
## [100] FALSE FALSE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE
## [111] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE
## [122]  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [133]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [144]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE
## [155]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE FALSE
## [166]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE
## [177] FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE
## [188]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [199]  TRUE  TRUE FALSE FALSE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE
## [210] FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE
## [221]  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE
## [232]  TRUE  TRUE FALSE  TRUE  TRUE FALSE FALSE  TRUE  TRUE FALSE FALSE

Comme j’ai de nombreux multiples, je vais les transformer en poids pour chaque arête

##   [1]  5  7  5  2  1  6  5  5  2  1  4  5  2  1  5  2  1  4  1  1  1  1 13
##  [24]  6  1  1  1  5  5  4  7  6  6  5  4  5  4  4  4  5  4  4  4  4  3  6
##  [47]  5  4  5  5  4  7  6  6  5  4  5  4  4  4  5  4  4  4  4  3  6  5  4
##  [70]  7  6  6  6  5  4  7  6  1  6  1  1  5  5  2  2  2  4  7  6  2  5  2
##  [93]  2  2  4  5  4  2  2  2  2  4  5  4  2  2  2  2  2  2  1  2  2  2  2
## [116]  1  2  2  2  1  4  4  1  6  2  1  5  2  5  2  2  4  7  6  6  2  5  2
## [139]  2  4  5  4  4  2  2  2  2  2  2  1  2  2  4  5  4  4  2  2  2  2  1
## [162]  2  2  2  1  4  4  3  6  5  4  1  1  1  1  1  1  1  1  1  1 13 11 10
## [185] 13  1  1 13 11 10 13 11 10 13 11 10 13 11 10 13  1  1 11 13 11 10  3
## [208] 11 13  3  3 10  3 11 13  3  3 10  1  2  3 13 11  1  1  1  1  1  1  1
## [231]  3  3 10  1 13 11  1  1 10  2  1  1

J’affiche mon nouveau graph: la largeur de l’arête dépend désormais du poids

2. Tracé de graphe

Il existe différentes visualisation, algorithmes, etc. La logique est toujours la même: je pré-traite mon objet igraph avec une fonction spécifique au tracé choisi, et j’utilise le résultat de ce prétraitement comme valeur du paramètre layout. Ici, le circular layout:

Il existe une multitude de layouts. Je peux tous les afficher d’un coup, pour jeter un coup d’œil à la forme qu’ils prennent, et choisir celui qui m’intéresse le plus

S’il y en a un qui m’intéresse, je peux l’appliquer de la même manière que pour le cercle.

Evidemment, je ne dois choisir un graphe adapté…

Il semble que la forme en étoile soit bien adaptée, étant donné la centralité de Molière:

2.1 Les algorithmes forced base

Les tracés les plus importants sont les forced base, qui nécessitent des algorithmes particuliers. Regrdons-les en détail.

2.1.1 Fruchterman Reingold

Fruchterman, Thomas M. J.; Reingold, Edward M. (1991), “Graph Drawing by Force-Directed Placement”, Software – Practice & Experience, Wiley, 21 (11): 1129–1164, doi:10.1002/spe.4380211102.

Plus d’informations ici

Le algorithme est assez comppliqué, et le temprs de calcul conséquent. On l’utilise peu avec des grandes bases de données (plus de 10 000 nœuds).

On peut jouer sur les paramètres et augmenter le nombre d’itération

Voyons le résultat apèrs 700 itérations:

2.1.2 DrL

Le nom a changé plusieurs fois: d’abord rebaptisé vxOrd, on parle d’OpenOrd.

  • Martin, S., Brown, W.M., Klavans, R., Boyack, K.W., DrL: Distributed Recursive (Graph) Layout. SAND Reports, 2008. 2936: p. 1-10.
  • S. Martin, W. M. Brown, R. Klavans, and K. Boyack (to appear, 2011), “OpenOrd: An Open-Source Toolbox for Large Graph Layout,” SPIE Conference on Visualization and Data Analysis (VDA).

Plus d’informations ici

Il va tenter de faire ressortir au maximum des grands clusters très nets en coupant les liens les plus longs. Evidemment cet algorithme nécessite des graphes de grande taille, nous chargeons donc un gros jeu de données tiré du package igraphdata.

Nous pouvons comparer l’effet de ce découpage avec celui effectué par l’algorithme précédent, Fruchterman Reingold

2.2 le Geolayout

J’ai préparé un tout petit jeu de données avec des coordonnées géographiques

##   id     label      lat      long
## 1  1     Paris 48.86472  2.349014
## 2  2 Bruxelles 50.85045  4.348780
## 3  3    Geneve 46.20439  6.143158
## 4  4   Londres 51.50853 -0.125740
##   from to
## 1    1  2
## 2    1  3
## 3    1  4

Je transforme ces deux objets en données igraph, qui vont me permettre de faire mes analyses de réseau par la suite.

Je projette ce réseau sur une carte, en plaçant les nœuds en fonction de leurs coordonnées géographiques

3. La force des liens

3.1 Les mesures

Densité (density): la proportion de liens dans un réseau relativement au total des liens possibles.

## [1] 0.6894587

Centralité de proximité: Distance moyenne du nœud à tous les autres nœuds (Closeness)

##          1          2          3          4          5          6 
## 0.03846154 0.02439024 0.02500000 0.02439024 0.02439024 0.02173913 
##          7          8          9         10         12         13 
## 0.02564103 0.02040816 0.02380952 0.02380952 0.02439024 0.02040816 
##         14         15         16         17         18         19 
## 0.02380952 0.02380952 0.02380952 0.02173913 0.02083333 0.02083333 
##         20         21         22         23         24         25 
## 0.02083333 0.02083333 0.02000000 0.02000000 0.02127660 0.02127660 
##         26         27         28 
## 0.02173913 0.02040816 0.02000000

Pour rappel, les noms attachés sont accessibles ainsi:

##                               closeness.cent      
## 1  "Molière"                  "0.0384615384615385"
## 2  "Guillaume de Luyne"       "0.024390243902439" 
## 3  "Claude Barbin"            "0.025"             
## 4  "Charles de Sercy"         "0.024390243902439" 
## 5  "Jean Hénault"             "0.024390243902439" 
## 6  "François Noël"            "0.0217391304347826"
## 7  "Christophe Journel"       "0.0256410256410256"
## 8  "Sieur de Neuf-Villenaine" "0.0204081632653061"
## 9  "Jean Ribou"               "0.0238095238095238"
## 10 "Jean Guignard"            "0.0238095238095238"
## 12 "Gabriel Quinet"           "0.024390243902439" 
## 13 "François II Noël"         "0.0204081632653061"
## 14 "Thomas Jolly"             "0.0238095238095238"
## 15 "Louis Billaine"           "0.0238095238095238"
## 16 "Estienne Loyson"          "0.0238095238095238"
## 17 "Claude Blageart"          "0.0217391304347826"
## 18 "Pierre Trabouillet"       "0.0208333333333333"
## 19 "Nicolas Le Gras"          "0.0208333333333333"
## 20 "Théodore Girard"          "0.0208333333333333"
## 21 "Etienne Maucroy"          "0.0208333333333333"
## 22 "Claude II Calleville"     "0.02"              
## 23 "Claude Audinet"           "0.02"              
## 24 "Pierre Le Monnier"        "0.0212765957446809"
## 25 "Pierre Corneille"         "0.0212765957446809"
## 26 "Philippe Quinault"        "0.0217391304347826"
## 27 "Pierre Promé"             "0.0204081632653061"
## 28 "François Muguet"          "0.02"

Centralité d’intermédiarité: Nombre de fois que le nœud se trouve sur le plus court chemin entre deux autres nœuds (Betweenness)

##           1           2           3           4           5           6 
## 222.8397763   0.9600000   4.3209524   0.9600000   0.3900000   0.0000000 
##           7           8           9          10          12          13 
##   5.0683883   0.0000000  10.2680258   0.0000000   2.3714286   0.0000000 
##          14          15          16          17          18          19 
##   0.0000000   0.0000000   0.0000000   0.9166667   0.0000000   0.0000000 
##          20          21          22          23          24          25 
##   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000 
##          26          27          28 
##   0.9047619   0.0000000   0.0000000

Centralité de vecteurs propres: Score d’autorité attribué à un nœud en fonction du score de ses voisins. (Eigenvector).

##          1          2          3          4          5          6 
## 1.00000000 0.56536647 0.65991521 0.56536647 0.23172674 0.10190675 
##          7          8          9         10         12         13 
## 0.55278661 0.06001095 0.55255801 0.48574803 0.58647420 0.06403130 
##         14         15         16         17         18         19 
## 0.27379413 0.27379413 0.27379413 0.49263907 0.03116947 0.03116947 
##         20         21         22         23         24         25 
## 0.03116947 0.03116947 0.04425426 0.04425426 0.17947299 0.06611127 
##         26         27         28 
## 0.09469017 0.05829650 0.03120315

Centralité de degré: Nombre de connexions du nœud (Degree)

##  1  2  3  4  5  6  7  8  9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 
## 82 36 42 36 15  6 33  3 33 30 36  3 18 18 18 27  4  4  4  4  2  2 11  5  7 
## 27 28 
##  3  2

On peut réutiliser ces données pour la visualisation, en ajustant la taille des nœuds à la centralité de degré

On peut ajuster cette taille avec d’autres mesures de centralité, comme la centralité de vecteur

3.2 Un exemple d’analyse de la centralité

Tentons une approche plus pratique avec un réseau célèbre: celui de la Florence de la Renaissance (disponible dans le package netrankr).

## Acciaiuol   Albizzi Barbadori  Bischeri Castellan    Ginori  Guadagni 
##     FALSE     FALSE     FALSE     FALSE     FALSE     FALSE     FALSE 
## Lambertes    Medici     Pazzi   Peruzzi     Pucci   Ridolfi  Salviati 
##     FALSE     FALSE     FALSE     FALSE      TRUE     FALSE     FALSE 
##   Strozzi Tornabuon 
##     FALSE     FALSE

J’obtiens un joli graphe:

Je peux proportionner la taille des nœuds en fonction de la fortune de chaque famille:

Mais est-ce que la richesse fait tout? Probablement pas… tentons d’évaluer la centralité des différentes familles

## [1] "Medici" "Medici" "Medici" "Medici" "Medici"

4. Visualiser

Il est possible de proposer une foule de visualisation. Par exemple, il est possible de remplacer les labels par la distance qui sépare un nœud d’un autre – ici, Thomas Jolly.

On peut mettre en valeur le chemin le plus court entre deux poins

On peut aussi regrouper en cluster les données, que l’on représente en dendogramme, comme pour la stylométrie

Je projette ensuite ma classification sur mon graph

On peut l’afficher en 3d. Pour cela j’utilise le paramètre dim=3 pour mon layout.

Je peux faire une sauvegarde, notamment en HTML pour l’ouvrir dans le navigateur

Je peux produire une visualisation interactive directement dans R. Je prépare les données

Et je lance une visualisation en 3D

Je rajoute des options de visualisation, comme une modification des nœuds s’ils sont sélectionnés, ou un selecteur sous la forme de liste déroulante

Je vais avoir besoin “d’écarter” mon graphe, en ajoutant de la répulsion entre les nœuds (ce qui n’est pas tâche facile…)